package com.sw.c.utils;

import lombok.extern.slf4j.Slf4j;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@Component
public class ExcelUtils {

    /**
     * 获取指定 Excel 文件中指定 sheet 页和行号的拼接字符串。
     *
     * @param filePath Excel 文件的路径
     * @param sheetName 工作表名称
     * @param rowNum 行号 (从1开始)
     * @return 指定行的数据拼接后的字符串
     * @throws IOException 如果文件读取出错
     */
    public static String getRowData(String filePath, String sheetName, int rowNum) throws IOException {
        // 获取 Excel 文件输入流
        InputStream fileInputStream = ExcelUtils.class.getClassLoader().getResourceAsStream(filePath);
        if (fileInputStream == null) {
            throw new IOException("文件未找到！");
        }


        // 读取工作簿
        Workbook workbook = new XSSFWorkbook(fileInputStream);

        StringBuilder rowData = new StringBuilder();

        // 遍历工作簿中的每个 sheet
        for (int sheetIndex = 0; sheetIndex < workbook.getNumberOfSheets(); sheetIndex++) {
            Sheet sheet = workbook.getSheetAt(sheetIndex);
            String currentSheetName = sheet.getSheetName();
//            log.info("currentSheetName数据：", currentSheetName);

            // 如果 sheet 名称不匹配，则跳过
            if (!currentSheetName.equals(sheetName)) {
                continue;
            }

            // 检查是否有指定的行号
            Row row = sheet.getRow(rowNum - 1);
//            log.info("row数据：", row.toString());

            if (row != null) {
                rowData.setLength(0); // 清空之前的行数据

                // 获取该行的所有单元格
                for (Cell cell : row) {
                    String cellValue = getCellValue(cell, sheet);
                    rowData.append(cellValue).append(",");
                }
                // 返回拼接后的行数据字符串
                return rowData.toString();
            } else {
                return "第 " + rowNum + " 行在 Sheet " + sheetName + " 中不存在。";
            }
        }

        // 关闭工作簿和文件输入流
        workbook.close();
        fileInputStream.close();
        return "Sheet " + sheetName + " 不存在。";
    }

    /**
     * 获取单元格的值，处理合并单元格的情况。
     *
     * @param cell 当前单元格
     * @param sheet 当前 sheet 页
     * @return 单元格的值
     */
    private static String getCellValue(Cell cell, Sheet sheet) {
        // 获取合并单元格的区域
        int numMergedRegions = sheet.getNumMergedRegions();

        // 遍历所有合并单元格区域
        for (int i = 0; i < numMergedRegions; i++) {
            CellRangeAddress mergedRegion = sheet.getMergedRegion(i);

            // 判断当前单元格是否在合并区域内
            if (mergedRegion.isInRange(cell.getRowIndex(), cell.getColumnIndex())) {
                // 找到合并区域内第一个不为空的单元格
                for (int rowIndex = mergedRegion.getFirstRow(); rowIndex <= mergedRegion.getLastRow(); rowIndex++) {
                    for (int colIndex = mergedRegion.getFirstColumn(); colIndex <= mergedRegion.getLastColumn(); colIndex++) {
                        Cell mergedCell = sheet.getRow(rowIndex).getCell(colIndex);
                        if (mergedCell != null && !mergedCell.toString().isEmpty()) {
                            return mergedCell.toString(); // 返回第一个非空的单元格值
                        }
                    }
                }
            }
        }

        // 如果单元格不是合并单元格的一部分，直接返回单元格的值
        return cell.toString();
    }

    /**
     * 获取指定 Excel 文件中指定 sheet 页和行号的拼接字符串。
     *
     * @param filePath Excel 文件的路径
     * @param sheetName 工作表名称
     * @param rowNum 行号 (从1开始)
     * @return 返回读取指定行的中文数组，和拼音字符串
     * @throws IOException 如果文件读取出错
     */
    public static Object[] excelRow(String filePath, String sheetName, int rowNum) {
//        int rowNum = 4;
//        String sheetName = "教基7181";
        StringBuilder fields = new StringBuilder();
        StringBuilder chfields = new StringBuilder();
        String ch = "";
        String field = "";

        String result = "";
        try {
            result = ExcelUtils.getRowData(filePath, sheetName, rowNum);
        } catch (IOException e) {
            log.error("读取出现错误表{}，第几行{}", sheetName, rowNum);
            throw new RuntimeException("读取出现错误");
        }

        String[] split = result.split(",");

        Map<String, Integer> cellCountMap = new HashMap<>();

        for (String cell : split) {
            cellCountMap.put(cell, cellCountMap.getOrDefault(cell, 0) + 1);
        }

        String[] newFields = new String[split.length];
        Map<String, Integer> usedCountMap = new HashMap<>();  // 用来记录已经添加后缀的字段

        for (int i = 0; i < split.length; i++) {
            String cell = split[i];
            if (cellCountMap.get(cell) > 1) {
                int count = usedCountMap.getOrDefault(cell, 0) + 1;
                usedCountMap.put(cell, count);  // 更新该字段已经使用的次数
                newFields[i] = cell + count;  // 添加递增的数字后缀
            } else {
                newFields[i] = cell;  // 如果不重复，则直接赋值
            }
        }


        for (String cell : newFields) {
            // 调用 convertToPinyin 方法，将 cell 字符串传递进去
            // 使用正则表达式筛选中文和数字，去除其他字符
            String filteredCell = cell.replaceAll("[^\\u4e00-\\u9fa5\\d]", "");

            String processedCell = convertToPinyin(filteredCell);
            fields.append(processedCell).append(",");
            chfields.append(filteredCell).append(",");
        }
        if (fields.length() > 0) {
            fields.deleteCharAt(fields.length() - 1);  // 删除最后一个逗号
            chfields.deleteCharAt(chfields.length() - 1);  // 删除最后一个逗号
        }

//        log.info("拼接后的拼音:{}",fields);
//        log.info("拼接后的中文chfields:{}",chfields);

        return new Object[] {fields , chfields };

    }


    /**
     * 中文转化拼音
     * @param chinese
     * @return
     */
    public static String convertToPinyin(String chinese) {
        StringBuilder pinyin = new StringBuilder();
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        format.setCaseType(HanyuPinyinCaseType.LOWERCASE);  // 小写拼音
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);  // 不带声调
        format.setVCharType(HanyuPinyinVCharType.WITH_U_AND_COLON);  // 使用"u:"表示"ü"

        try {
            for (char c : chinese.toCharArray()) {
                if (Character.toString(c).matches("[\u4e00-\u9fa5]")) {
                    // 如果是汉字，则获取拼音
                    String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, format);
                    if (pinyinArray != null && pinyinArray.length > 0) {
                        String pinyinString = pinyinArray[0].toLowerCase();
                        // 将拼音中的"u:"替换为"v"
                        pinyinString = pinyinString.replace("u:", "v");
                        pinyin.append(pinyinString);  // 获取拼音并添加到结果中
                    }
                } else {
                    pinyin.append(c);  // 如果不是汉字，直接附加原字符
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return pinyin.toString();
    }


    public static void main(String[] args) {
        try {
            String result = ExcelUtils.getRowData("file/教委.xlsx", "教基7181", 4);
            System.out.println("指定行数据： " + result);
        } catch (IOException e) {
            System.err.println("错误: " + e.getMessage());
        }
    }
}

